package 结构型模式.装饰者模式;

/**所谓装饰就是给一个类增加她自己没有的职能（方法），和继承是一个意思。
 * 但是比继承灵活。被继承对象可以动态传入，但是使用继承就必须写死。
 *
 *
 * 原理. 模式的结构
 * 装饰模式主要包含以下角色。
 * 抽象构件（Component）角色：定义一个抽象接口以规范准备接收附加责任的对象。
 * 具体构件（ConcreteComponent）角色：实现抽象构件，通过装饰角色为其添加一些职责。
 * 抽象装饰（Decorator）角色：继承抽象构件，并包含具体构件的实例，可以通过其子类扩展具体构件的功能。
 * 具体装饰（ConcreteDecorator）角色：实现抽象装饰的相关方法，并给具体构件对象添加附加的责任。
 *
 *
 * 装饰（Decorator）模式的主要优点有：
 * 装饰器是继承的有力补充，比继承灵活，在不改变原有对象的情况下，动态的给一个对象扩展功能，即插即用
 * 通过使用不用装饰类及这些装饰类的排列组合，可以实现不同效果
 * 装饰器模式完全遵守开闭原则
 *
 *
 * 其主要缺点是：装饰模式会增加许多子类，过度使用会增加程序得复杂性。
 *实现思路：
 * 一个接口叫接口A
 *  现在接口A已有一个实现类叫 实现类一。
 *  我要对已有实现类的，某个方法做扩展，但是不使用继承，不改变已经有的实现类一。
 *  这个时候就出现了装饰类，装饰类。也是对接口A的实现，
	 *  里面有个属性为接口类，
	 *  构造方法修为必须传入一个 接口A 的实现类。
 *  	接口方法实现为{
 			//*加入自己的扩展代码（自己扩展的代码运行了）
 *  	    构造方法传入的对象调用自己的方法。（需要扩展对象原有的代码运行了）
 *  	    //*加入自己的扩展代码（自己扩展的代码运行了）
 *  	}
 *
 *
 * 	实现了对已有类的方法的扩展。但是又不得改变已有类的已有方法。也脱离了继承的管理相对一继承关系更加解耦。
 *
 *
 * 	当需要通过对现有的一组基本功能进行排列组合而产生非常多的功能时，采用继承关系很难实现，而采用装饰模式却很好实现。
 * 当对象的功能要求可以动态地添加，也可以再动态地撤销时。
 * @author chenhs
 * @date 2020/10/15
 */
public class Test {
	public static void main(String[] args) {
		TargetImplA ta = new TargetImplA();
		TargetImplB tb = new TargetImplB();
		ArnisherA aa = new ArnisherA(ta);
		ArnisherA ab = new ArnisherA(tb);
		aa.speak();
		ab.speak();
	}
}
